package base.algorithm;

import org.junit.jupiter.api.Test;
/**
 * @author suiwei
 * @date 2023/7/10 22:16
 */
public class Recursion {
  @Test
  void test() {
    System.out.println(add(1));
  }

  //直接递归：方法直接调用自己
  //栈溢出异常：java.lang.StackOverflowError
  void method() {
    method();
  }

  //间接递归
  //栈溢出异常：java.lang.StackOverflowError
  void methodA() {
    methodB();
  }
  void methodB() {
    methodA();
  }

  //求5的阶乘
  // 5!=5*4！；4！=4*3！......1!=1
  int jc(int num) {
    if (num == 1) { // 出口；递归问题，第一步找出口
      return 1;
    } else {
      return num * jc(num - 1);
    }
  }
  //求1-n的和
  int sum(int num){
    if (num==1){
      return 1;
    }else{
      return num+sum(num-1);
    }
  }

  // 有一对兔子，从出生后第3个月起每个月都生一对兔子，
  // 小兔子长到第三个月后每个月又生一对兔子，假如兔子都不死，问第二十个月的兔子对数为多少？
  // 兔子对数：1 1 2 3 5 8 13 21 ...
  // 从第三个月开始，兔子的对数是前两个月相加的和
  int add (int n){
    if (n==1||n==2){
      return 1;
    }else {
      return add(n-1)+add(n-2);
    }
  }
}
